package net.sk.china.city.talk.service.product;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import net.sk.china.city.talk.model.product.StoreProduct;
import net.sk.china.city.talk.request.product.StoreProductAddRequest;
import net.sk.china.city.talk.request.product.StoreProductRequest;
import net.sk.china.city.talk.request.product.StoreProductSearchRequest;
import net.sk.china.city.talk.request.product.StoreProductStockRequest;
import net.sk.china.city.talk.response.product.StoreProductInfoResponse;
import net.sk.china.city.talk.response.product.StoreProductResponse;
import net.sk.china.city.talk.response.product.StoreProductTabsHeaderResponse;
import net.sk.china.common.request.PageParamRequest;

import java.util.List;

/**
 * StoreProductService 接口
 * +----------------------------------------------------------------------
 * | Talk To [ 聊来改善地区金融服务环境，助力企业发展 ]
 * +----------------------------------------------------------------------
 * | Copyright (c) 2018-2024 聊来All rights reserved.
 * +----------------------------------------------------------------------
 * | Licensed ( <a href="http://www.apache.org/licenses/LICENSE-2.0">apache</a> )
 * +----------------------------------------------------------------------
 * | @Author: 聊来 <18970881148@qq.com>
 * +----------------------------------------------------------------------
 * | DateTime: 2024/6/4 11:32
 * +----------------------------------------------------------------------
 */
public interface StoreProductService extends IService<StoreProduct> {

    /**
     * 获取产品列表Admin
     * @param request 筛选参数
     * @param pageParamRequest 分页参数
     * @return PageInfo
     */
    PageInfo<StoreProductResponse> getAdminList(StoreProductSearchRequest request, PageParamRequest pageParamRequest);

    /**
     * 新增商品
     * @param request 商品请求对象
     * @return Boolean
     */
    Boolean save(StoreProductAddRequest request);

    /**
     * 更新商品信息
     * @param storeProductRequest 商品参数
     * @return 更新结果
     */
    Boolean update(StoreProductAddRequest storeProductRequest);

    /**
     * 商品详情（管理端）
     * @param id 商品id
     * @return StoreProductInfoResponse
     */
    StoreProductInfoResponse getInfo(Integer id);

    /**
     * 获取tabsHeader对应数量
     * @return List
     */
    List<StoreProductTabsHeaderResponse> getTabsHeader();

    /**
     * 根据其他平台url导入产品信息
     * @param url 待倒入平台的url
     * @param tag 待导入平台标识
     * @throws Exception
     * @return {@code StoreProductRequest}
     */
    StoreProductRequest importProductFromUrl(String url, int tag) throws Exception;

    /**
     * 根据商品id取出二级分类
     * @param productId String 商品分类
     * @return List<Integer>
     */
    List<Integer> getSecondaryCategoryByProductId(String productId);

    /**
     * 删除商品
     * @param productId 商品id
     * @param type 类型：recycle——回收站 delete——彻底删除
     * @return 删除结果
     */
    Boolean deleteProduct(Integer productId, String type);

    /**
     * 恢复已删除商品
     * @param productId 商品id
     * @return 恢复结果
     */
    Boolean reStoreProduct(Integer productId);

    /**
     * 后台任务批量操作库存
     */
    void consumeProductStock();

    /**
     * 扣减库存任务操作
     * @param storeProductStockRequest 扣减库存参数
     * @return 执行结果
     */
    boolean doProductStock(StoreProductStockRequest storeProductStockRequest);

    /**
     * 添加/扣减库存
     * @param id 商品id
     * @param num 数量
     * @param type 类型：add—添加，sub—扣减
     */
    Boolean operationStock(Integer id, Integer num, String type);

    /**
     * 下架
     * @param id 商品id
     */
    Boolean offShelf(Integer id);

    /**
     * 上架
     * @param id 商品id
     * @return Boolean
     */
    Boolean putOnShelf(Integer id);

    /**
     * 模糊搜索商品名称
     * @param productName 商品名称
     * @return List
     */
    List<StoreProduct> likeProductName(String productName);

    /**
     * 警戒库存数量
     * @return {@code Long}
     */
    Long getVigilanceInventoryNum();

    /**
     * 销售中（上架）商品数量
     * @return Integer
     */
    Long getOnSaleNum();

    /**
     * 未销售（仓库）商品数量
     * @return Integer
     */
    Long getNotSaleNum();

    /**
     * 获取商品排行榜
     * @return List
     */
    List<StoreProduct> getLeaderboard();
}
